{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "###Simple three layer network with outputs of hidden layer units."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from __future__ import print_function\n",
    "import matplotlib.pyplot as plt\n",
    "import torch as th\n",
    "import numpy as np\n",
    "from torch.autograd import Variable\n",
    "\n",
    "\n",
    "def train(x, y, w1, w2, b1, b2):\n",
    "\n",
    "\toptimizer = th.optim.Adam([w1, w2, b1, b2], lr = 0.01)\n",
    "\n",
    "\tdef closure():\n",
    "\t\toptimizer.zero_grad()\n",
    "\t\thid = th.tanh(x.mm(w1) + b1.expand(x.size()[0], b1.size()[1]))\n",
    "\t\ty_pred = hid.mm(w2) + b2.expand(x.size()[0], b2.size()[1])\n",
    "\t\tloss = (y_pred - y).pow(2).sum()\n",
    "\t\tloss.backward()\n",
    "\t\treturn loss\n",
    "\n",
    "\tfor t in range(10000):\n",
    "\t\tif t % 1000 == 0:\n",
    "\t\t\tprint(t, closure().data[0])\n",
    "\t\toptimizer.step(closure)\n",
    "\n",
    "\n",
    "def forward(x, w1, w2, b1, b2):\n",
    "\thid = th.tanh(x.mm(w1) + b1.expand(x.size()[0], b1.size()[1]))\n",
    "\treturn hid.mm(w2) + b2.expand(x.size()[0], b2.size()[1])\n",
    "\n",
    "def get_neu_output(x, num, w1, w2, b1, b2):\n",
    "\thid = th.tanh(x.mm(w1) + b1.expand(x.size()[0], b1.size()[1]))\n",
    "\treturn hid[:,num].unsqueeze(1).mm(w2[num,:].unsqueeze(0))\n",
    "\n",
    "\n",
    "def get_variables(M):\n",
    "\tw1 = Variable(th.randn(1, M).type(th.FloatTensor), requires_grad=True)\n",
    "\tw2 = Variable(th.randn(M, 1).type(th.FloatTensor), requires_grad=True)\n",
    "\tb1 = Variable(th.zeros(1, M).type(th.FloatTensor), requires_grad=True)\n",
    "\tb2 = Variable(th.zeros(1, 1).type(th.FloatTensor), requires_grad=True)\n",
    "\treturn w1, w2, b1, b2\n",
    "\n",
    "def f1(x):\n",
    "\treturn x * x\n",
    "\n",
    "def f2(x):\n",
    "\treturn np.sin(x)\n",
    "\n",
    "def f3(x):\n",
    "\treturn np.abs(x)\n",
    "\n",
    "def f4(x):\n",
    "\ttmp = np.ones(50)\n",
    "\treturn tmp * (x > 0)\n",
    "\n",
    "def to_torch_array(x):\n",
    "\treturn Variable(th.from_numpy(x.reshape(x.shape + (1,))).type(th.FloatTensor), requires_grad=False);\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0 812.184814453\n",
      "1000 359.998016357\n",
      "2000 356.813873291\n",
      "3000 1.34534204006\n",
      "4000 0.683217406273\n",
      "5000 0.416068404913\n",
      "6000 0.275015056133\n",
      "7000 0.194970846176\n",
      "8000 0.148987457156\n",
      "9000 0.126978754997\n",
      "0 63.7587471008\n",
      "1000 0.814015448093\n",
      "2000 0.0195265579969\n",
      "3000 0.000559626903851\n",
      "4000 0.000436100439401\n",
      "5000 0.000304073881125\n",
      "6000 0.000180434610229\n",
      "7000 0.000110377361125\n",
      "8000 7.21723699826e-05\n",
      "9000 6.23908708803e-05\n",
      "0 282.504089355\n",
      "1000 0.724844396114\n",
      "2000 0.496185868979\n",
      "3000 0.416537135839\n",
      "4000 0.378952890635\n",
      "5000 0.357165247202\n",
      "6000 0.34300249815\n",
      "7000 0.333125799894\n",
      "8000 0.326259195805\n",
      "9000 0.321108579636\n",
      "0 141.59588623\n",
      "1000 0.4077681005\n",
      "2000 0.255169183016\n",
      "3000 0.174276977777\n",
      "4000 0.118171408772\n",
      "5000 0.0763184502721\n",
      "6000 0.0454469174147\n",
      "7000 0.0269156247377\n",
      "8000 0.016214646399\n",
      "9000 0.00971890427172\n"
     ]
    }
   ],
   "source": [
    "# Generate training data\n",
    "\n",
    "x = np.arange(-3, 3, 6.0 / 50)\n",
    "y1 = to_torch_array(f1(x))\n",
    "y2 = to_torch_array(f2(x))\n",
    "y3 = to_torch_array(f3(x))\n",
    "y4 = to_torch_array(f4(x))\n",
    "\n",
    "x = to_torch_array(x)\n",
    "\n",
    "#init variables\n",
    "case1 = get_variables(3)\n",
    "case2 = get_variables(3)\n",
    "case3 = get_variables(3)\n",
    "case4 = get_variables(3)\n",
    "\n",
    "train(x, y1, *case1)\n",
    "train(x, y2, *case2)\n",
    "train(x, y3, *case3)\n",
    "train(x, y4, *case4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD8CAYAAAB0IB+mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXmYVMW1wH91b+893T1LD8MwMOy7gMAIIqio4L7GJe4R\nTYzGvERNiDHmaUz0RXl5Znkv0aiJS6KJxmgkRsUAAiqyg+z7Pqyz977cW++PbsZhGbaZobtn6vd9\n9+s79/StOt1TfaruqVOnhJQShUKhULR/tEwroFAoFIpTgzL4CoVC0UFQBl+hUCg6CMrgKxQKRQdB\nGXyFQqHoICiDr1AoFB0EZfAVCoWig6AMvkKhUHQQlMFXKBSKDoIl0wo0xe/3yx49emRaDUU7ZfHi\nxVVSyuKWliOE6Aa8CpQAEnheSvnro92j2raiLTnetp1VBr9Hjx4sWrQo02oo2ilCiG2tVFQS+J6U\ncokQwgMsFkL8W0q5urkbVNtWtCXH27aVS0ehOEGklLullEvS5wFgDVCWWa0UimOjDL5C0QKEED2A\n4cD8zGqiUBybrHLpHI259fWHXSux2ejtdCq5kjfKz/L5DntfWyGEyAP+DtwvpWw4gvxu4G6A8vLy\nU6aXIreRUhIzYjgsDgBW7VtFVbiKceXj0DW9RWXnjMFXKLIJIYSVlLF/TUr59pHeI6V8HngeoKKi\nQuUhVxyRYDxITaSG2kgtddE6gvEgdoudCb0mAGBKE6fVSdJMttjgi2zKh19RUSHVxJairRBCLJZS\nVrRCOQJ4BaiRUt5/PPeotq2A1Oi9LlpHbbSWXgW9AFi6eyk7G3Zi1a3kO/Lx2X147B66ersed7nH\n27bVCF+hOHHGArcBK4QQy9LXfiSlfD+DOimylFgyxp7gHvaG9lIdriZpJgEozSvFaXXSr6gf/Yr6\n4ba521wXZfAVihNESvkpIDKthyJ7CSfCWDUrVt3K3tBelu9djsvqosxbht/lx+/yY9NtAKfE0B9A\nGXyFQqFoBZJmkt2B3Wyv305NpIahJUPpnt+d0rxSCnoU4LF7Mq2iMvgKhULREgzTYOW+lVQGKjFM\nA7fNzQD/ADq5OwFg1VMj/WxAGXyFQqE4QaSUBONBPHYPuqYTjAcp85TRzdeNQmdhptVrFmXwFQqF\n4jiRUrI7uJv11esJJ8JM7DURq27lrG5nkQreym5aZaWtEOKPQoh9QoiVTa4VCiH+LYTYkH4taI26\nFAqFIhPsDuxmzrY5LN61GCklw0qGNcbF54Kxh9ZLrfAycPEh134IzJBS9gVmpP9WKBSKnKM2Usui\nXYswpMGI0hGM7zGeMm8Zmsit7DSt4tKRUs5J5xRpylXA+PT5K8As4KHWqE+haC8kqhMEFgUOvijA\nPdSNvbOdRE2CwOJA4/UD5A3Jw1ZiI1GTILg0eFiQqPs0N7ZONhK1CYJfBL8sOj0SdQ1yYStOyUMr\nQoeV7xqQkifrk4RWh0CA0ETqPQKcvZxYC60kg0mim6ON14UQoIG9zI7Fa8GIGiT2JkBP3S90ATpY\nvBY0m4Y0JDIpEVaRKj+LiCVjVEeq6eLpQoGzgNFdR1PsKs6Z0fyRaEsffomUcnf6fA+p3OEKhaIJ\nwi6wdbF9eSG98F13pl0FVoGtk41DV8QLu2iUWwoO+RnL1HUAoQv0PP2gsg9cP/CqObSDZE3lUkow\nU6/SlCDT50bqBhmTxPfEG69jpuqx5FtSBr/BILg8yKF4KjzYS1MdWsO8hsY6hVUgLCLVYRXbSAaT\nxLbH0Bwaml1D2FP66i69TTuI7fXbWbVvFRJJsasYq25tjLrJZU7JpK2UUgohjpjDQSWYUnRkLHkW\n8obkNS/3WMgbdnS5Z0Tz8d0WrwVvhffo8lHNy635Vnxjm09IZy2yUnhh81EpVr+VgokFYIA00x2F\nQWMnpOfpuIe4kQnZeJgJs7HDMkMm0S3RVGfTBO8ob+oJpzZBdHMUzZ3qBPQ8Hd2jo1lPztUSToT5\nYs8XVIWr8Lv8DC0ZmjUhla1BWxr8vUKIUinlbiFEKbDvSG9SCaYUivaL0AS6o/mEX7pTx9nD2azc\nVmKj6LIizISJGTMxoyYyJtF9qTJlXJKsT2LsNg56SvGN9TW6nMyQiaXQcsxOIG7Emb11NgBDS4ZS\n7ivPaffNkWhLgz8V+BrwVPr13TasS6FQtGM0q5Yy2Ic87NhKbNhKUi4vM2JiBA2SDUl0T6pDiO+K\nE14XBlJPM5YiC9YiK7ZOtka3lSlNNKFh020M7jSYYlcxTmvznVAu01phmX8BPgf6CyF2CiHuImXo\nJwohNgAT0n+fFNWb6nj2x5VUVbWGtgqFor0hhEB36dg62XD1cTWO5p29nfjO8uHq70LYBLHtMYJL\ngo1zIvt37+fjVR9TE6kBoNxX3m6NPbRelM5NzYguaI3y//WbTbz/m11Y4mG+MaVvaxSpaK9UV0NR\nUaa1UGQJQhdYi6xYi1J+eGlKjJCBZtHYXLuZtR+vxR6yE9kbIdI7gr3MftL+/1wgJ1baXvrIcCSC\na4athS/CMHQotDPfmqKFmCasWAHbt8OZZ0JxcaY1UmQhQhNoeRrL9ixjR/0OSkaVMMAcgLHLILQi\nRHhVGEdPB+5Bpy6D5akkJ7oyfyeNr/16BN6RfWlYuZ0/f2cBVXuSmVZLkS3E49R9OI+3f7WdWn9f\n8PszrZEii9lat5Ud9Tvo7+/PGb3PwNvPS8H4AvLPzcfRw9Ho/5eGJLYrdlhIbC6TEyP8RgYM4PVX\nXbz3f8vRE59x069Gg8ORaa0UmSQYhAULmPFWhO+8PIL7B5UxeUymlVJkI1JKhBD0zO+Jz+6jyHWw\n68/itWAZ/KVJjO2OEVwaRHfrqYVopbacj9rJLYMPXPdgOYbVwaUDF1P/3ie8vGY0t9zrVYO6Dkj1\n2v3M/MViLrxIY/yPzuL+gQVMmpRprRTZSHW4mpX7VjK662gcFsdhxv5I2MvsCIsgvDZMYHEAi9eC\na6ALWyfbMe/NVnLO4Pv9cN/jnaBhLG9+bz4fvvgZerKCbz+ufLYdiq1bmfX0Sv7vZQ87e43igeud\nTJ6caaUU2cjuwG6W7F6Cy+o6tnsmHoelS2HuXKLL17Nr3g7K9UriURf7qkuIeXUCzghlZ3XH6NWX\nt/eN49IfnY6/c26Y0tzQ8kh4vZz/6DgMfQGX9p8PO4ZBt26Z1krR1kgJq1bBli1ccFMJW/qP4Lav\n524zVrQtW+u2smLvCgqdhYwqG3XEVbPVm+uZ//A/mFD9BtbPPkZEoymBq5CGcDnbBnbFcNlZsQm6\nWpPYt1fCts/Rog5u40ESv3cTu+ACphXezFk/vwJ/t+wN68zpX4q/m5Ob/vcs6mYs5u1Hl3HeN8MU\nnNk/02op2opEgroZi5n5xn7O+3pvCs4ayPcvzG2fqqLt2FG/gxV7V1CSV8LI0pGNqYwbWbYMfvlL\nfK/9lUuNOPUF3Vle8U2e+nQc5z9yFjfc34XpL9HoJtzyEgy5EqZOhc4Xx4jN3saqf6zknM6z4Z9v\ncWXDu8Te8hC57Q5eLf4e1z7YPftczVLKrDlGjhwpT4YpTxlyGEvl3++YKuWSJVIaxkmVo8higkEp\nZ86Ub93xT9mNbXLKlBMvAlgkc6xtK06eaCIqV+1bJQ3zEHswd66MnXOBlCBNl1uG77xP/unb8+T+\nfabcv1/KKVOk3L//2OXH9sRk9bRquf+f++XOuQH5169Pl5EbbpNJ3SoT6HLliNuk3LSpbT7cIRxv\n2864kW96nOyP4sA/qXreeln/56nyz/fNlft3xU+qLEX2UbWuSr5514ey7q8fyKp1Vcf9gzwUZfA7\nBpUNlYcbeSmlXL9eRi+/VkqQAXeJ/AFPyV//pKZFdRlxQzYsbpD7p+6XgeUBKaWU1cu2y4VnPyBN\nl0uaNpucN/4hWbWloUX1HIvjbds5EYd/LPx+mDwZCkf35bXVw3n9tzVMf/wziEQyrZqipWzfzqyn\n5vG7P9h4aePZFPUrYvJkFWqvODLrq9ezeNdidtTv+PJiLAaPPw6DByM++pBHeZzffGcj/ikPcfN9\nLduIT7NqeEZ4yBuWh6NnKkS8cFg3KuY8g9iwgVVDbmT0rKexDenHO1/7R8bTw+S0D/9IXP9AVwyr\ng0sGLoJPPoHRo8HXfHpXRZZimqnJ2a1bueCGYrb2G8mtX28/aWoVrc+mmk2sq1pHN183yn3pVOvz\n5pG84y4s61YTvfZmQo//D573OzNpUusOGhzlX64HCiwLYPFZcPbsQucPX+FPj9/HhLe+yTWvXsPq\nFbfgn/4bKMzMRuftYoTfFL8fvv0TP75Lx1If0Hjrgc+oWVGZabUUJ0Isllo5+8xWagt7k3/RaL73\nQ6sa1SuaZVvdNlbvX00XTxeGlQxDmCb87GcwbhzhvQEu5V/87+jXKBrcuU2fEKUpkQlJaGWI4Iog\nRUWS2/53FNYlC/hs4k8YuOINjMFD+Mu9czIy2m93Br8Rj4c/rD+bX77kY9YzS2DNmlRInyK7qa+H\nTz5hxlu1/MfLI3hx7iCVN0lxVGLJGKv2r6Ikr4ThpcMRlZUkzj4fHn2U6NVfJbFkJedNufSULMoT\nmsBT4cHZ20l0a5TAggBm0sRfamXsR48hFiygPunmhufOY/VtP089yZ5C2p1Lpym3f8OOoY3hvDGr\naFiykam/refiR0biL1WugaykspL62cuYNsvO8G+N4/6BPrVyVnFM7BY7Z3U7C6/di/bZXLj2WmRd\niNt5hSGjbmNyT3FKF+UJIXAPcqPn6QSXB2n4vAHfOF8qLcPw4ciFi1l/9d2c8+GP4MrP4PXXwdv8\nrmOtSfsd4ZOezH1Io+CcIby+ahh/+W01M37yCTQ0ZFo1RVMOZLpcsoT3PivgthfO5h8f+9TkrOKo\nVIer2dmwE4B8Rz6hX/0BY/z5GHk+Qh8vZMiU25l0Z+aeDh3lDryjvTj7Og/KwVPUw8PApa/Db3+L\nnDaNqn5jqFm46ZTo1K4NflOue7Cci38yhosnJKl/7xOe+9H2jM+YK4BQiLr3Pm3011/02Jk8McWu\nRvaKoxKMB1m4ayEbazZixmNw3314Hrybfxvn89vb51Nw1sCsGDDYim3YO9sBiO2KkWxIZ/kVAr71\nLd648yPE3j04x4+CWbPaXJ8OY/D9fviPxwrxXXku/5xbxL9+/gX/+tkSSKo0yxlj926YM4d/Tw1z\n78ujeHHuIPydtKz4oSqyl1gyxvyd89GExqj8wSQvvQZ+9ztq7prMyqf+1eJQy7ZAmpLQ6hD1c+tJ\n1CYar0948jze/sF8rF1LkBMn8sENL7XpQLTDGPxG7HYufmw0V04ewAUDd/HGfXOo3qJcPKcUw6D2\nk5W8/aNF1CXzOO/Rc/j+lBI1qlccE8M0WFC5gJgRY5S9F64LL8Mycxrf4Hn+0H8K339Iz8rBgtAE\nvrN8aDaNhnkNJGpSRt/vh2883QfLgs/Z1vM8Lvnbnay59Yk2CzDpeAYf8BcLvjGlL+/sGcOLzxvM\n+tknsGmTiuI5FdTVwZw5fPzHLfzny714YfVY/OUuNapXHBeVgUrqonWMSPjJP/9SWLGC4Ctv02/K\nN7J+wKC7dLxnedHsGg3zGw4a6ePzkTfrPVaNuJWzp/0nS8feR9Veo9V1aNdROsfipm8XEbefywUV\nX9AwbzXvPbOHCx8ajr/clWnV2h9SUrNgAx8/t54Jl9k594djuGOQP+t/pIrsotxXjm/9NjyXX0Uk\nECP21nTyLxtLrmTG1h0po98wt4H47jjWgi8jBv1dbPgXvsL8C7owetYU1k/Yg3/Ba+BsveybHXKE\nfwC/H773sI38iWfw2urh/Ol3Dcz6ySzYulWN9luTQAA+/ZRZz63jyZe78OLG8RT196tRveK42dmw\nk0AsAPPm4ZtwOcGYhYrIJ7ywemymVTthdIeOb5yvcd9c2dTWaBq9//Y0M678FX1X/QMmToSamlar\nu0OP8Jty/QNdibqLmDB8GQ2freC9KTu5aPJQinqemvjYdolhwIYN1C/ZyEczLQyfNJKbBnXha2pU\nrzgB9oX2sWzPMjxL9zDm9gfQu5SQfGcmd/y7PGefEDVbaqxthAwCiwLknZ6HxZcyx34/XPDud+HN\nUuRtt1E96Gy0j6ZROLRry+ttcQntBL8fHviRk/xLxvDa6uG88myIWT+dQ+3cNfziaUOFcJ4g1Wv3\n88a3ZtOweAP/WFDGLX84n3fmd1GjesUJUR+tZ9GuRXhXbeSM27/D5ngZz98ym8LTy9tHW9JAJiUN\n8xpIBg6JGLzhBt6440Nse3egnzsW1q1rcXVqhH8Ern+gK+G8Tpw/Zg0fv7CRaS/vJK9hAPc80VUt\n8z8WoRCsXs3s3+3h9y+72V86hht/7OfJMnJ2NKbIDNFklAWVC7AtXc6oO3+CpWdvZt4wgxu+0znT\nqrUaulPHe6aX+s/qaZjXgG+sD9315UYtE548j3ccs7jt9Yvh4otTRt928nvqCplFvuqKigq5aNGi\nTKtxENUbapj2y1VcPrYOM8/Ln5cO5sZv+3N/ZNHaJBLUzl/PzD9sYcJFOkavvvzh415MukvLmu9K\nCLFYSlnRSmVdDPwa0IEXpZRPHe392di2s51le5ax8b2pnP/dJ/H2HIDl4+lQ3D73rk4GktR/Vo9m\n1fCO9aI7Dtmda8MG2LkTzjvviPcfb9tWI/xjUNS3kJt/Ow527eLNx9cw7YXPcezwE+nWj5u+XZQ1\nxixTVO1O8I9nNnP9yM3MnGbw+MvlbOvXnwdvtDN5VKa1axuEEDrwW2AisBNYKISYKqVcfaJlSSkJ\nGQZ5FvVTPJQh8zbT7bs/Y0t4KHOv+4j/KC7KtEpthsVjwXuml/Cq8EFpGBrp2zd1tLSeFpfQERAC\nyso4/4lS6gq3Yq/cyLuPz6VwfxG3PN6vHTgST4J4HLZsYdaUzbz7xyS2/yjlssf6s3mQh9vbv+tm\nFLBRSrkZQAjxV+Aq4IQN/upwmB3RKGN9PjzK6AOpjce7/ns+lptvxTt0BJ9dNY2bv5WfabXaHGu+\nFd/Y1N4d0pRIU6JZWneaVbWwE8DfSePup3pRtbc7ka7buXzkRhqmfc6/PvFy0T09KRxSBrp+7IJy\nmUCA2iVbmPHKTi68wGDCTaVU9ujHpfd6KUrvPNYBKAOabKnETmD0yRTUy+FgVyzGvIYGxvl8ONt7\n+zkGG2s2svjPz2E8/kvKh5+JdfoHfOcUZZLMJgJLAsi4xDvai9Bbb95QGfyTwF+ic/fPe4LZned+\nvJO//H4L9tgXXHDxav6+oBtXfbtb+wrnNE3Ys4e65duZ+cZ+IjGNKX/pys6evbj/Fg/fnZBpBbMT\nIcTdwN0A5eXlR3yPU9cZ7fXyWX19o9G3ah0zeG5XYBdr3vwdvZ7+FTtqxvHPB97nfm9eptXKCPZS\nO4ElAQKLAnjO8CC01jH6HbNltRaaxnUPlnP5lHM59+GzePczP28/s4XZP51N3buzef6Hm6naGc20\nlieHlFBTQ+3s5fzt7o9o+HgxH70d5KGXB7C590RunTKMW+/1ZFrLRkxpsnzvcrbVbTsV1VUC3Zr8\n3TV97SCklM9LKSuklBXFR5ls9FosjPJ6CZsmiwKB1tc2B6iJ1LD0T1Mo/PkvGdJ7PMue+IBb7+mY\nxh7AXmYnb2ge8X1xgkuDtFZwTc6M8M2YiWbPvv7J3+jGKOLSR4vYXxpn/IWVfPDiDv753Crytq2C\ngnwu/lpnCgeWnLKNDk4Kw4DqampX72b6a3u5aHyMGTN0/uulUvZ27caNTxZxd1/R6vuBtpSEkWDR\nrkVUhavoW9Tyia3jYCHQVwjRk5ShvxG4+YRLSSSI3nQHb3e6hwt/ejYjPHlYOmDYr5SSZX94Eucz\nv6bYeQHBP0/lfpXeBEd3BzKZyrIp7IK801reAba5wT/R8LUjYYQN6ubU4ejhwD3A3eo6thYHUjVA\nTyZ278nesiBV+/bw5v/uwRFZy4QJa5k2y86EG4so6ONPbWScl5e52H7DSG0pWFVF3cYqZrxVy8QL\nTGbMtPDUHztRVdKZ6/+rhC0DLdw4qWnnlj2E4iEWVC4gnAhzeufT6ebrduybWoiUMimE+DYwjVS7\n/qOUctUJF1RTQ2jOYq7efxHvJd7lhhcmNorqEgnyrR1jZzbx3HOM+t4zbO0zgaGr/8nP3nBkXTvL\nFM7eTqQpsRa2TltoU4PfWuFrmkPDXmonsiGCGTHJG5bXaj6ttsLvh/t/nEdVVR9i3fpwzk1RXv/d\nPn7/YjWSKi4ev4vp0+GCC3Wk18c7M31cdZuXwm5ucLvB4Wg9ZaSEcDi1KCoYpHZrPdPerGfc6UEW\nzJdMmAAffOrjZy/1ZE83P1/9uZ8tAzSuz1Ij35Rle5YRM2Kc2fVMilynLmxPSvk+8H6LCikpgdlz\nCF4wketfvRyu+BtceSU1iQSf1dfT3+Win6v9jnRNabLh50/Q/5HHsF14OZ3/+BY/e11tfnMorr6t\n1wbaeoTfKuFrQhPkDctDc2qE14UxoyaeCg+aNftcPIfypcF0cN2D5QQKyjl/Evzx9yF+8XItPyus\nwx6t52+/246vxmDCBJg+HUaN0flssYOLrnIg7Q7+8b6Nq6+zUFBsAYsFDp3YMwxIJqmtMvjH3xJc\nc0kUYjGmTY1x8fgIQkqmTydV/iw7z7yYz8xzSnl3Tj4/6F/I135mZWcv+GoOGHlIuQGEEJze+XQA\n3LbsffI7GkUDO8HKj+GSS5Bf+QrvffXPjPn1jXSz21kXDuPQNMpbs/PPEqSULPufyVS+8gwLHZey\nd/zf+V6ZLevbXa7T1ga/1cLXAFz9XGhOjeAXQcLrwq3i0zqVNDWkt37TTcLm5opJqYRIld0l59wU\n5dUXg/zi5RCXbAqx4JMohiWKnqzjzedjeGsMJk740nADh51HY4K//sWKM2zHsNj5xQuFBH1OEjY3\nP3rZzY/7ubn953a29oMrr4S+U+FrOWLkIWUo1lWvI5KIMLx0eM4a+oMoLITp09k57HIue/1mPoqH\nuPDNO4lJyfJgEJsQdLbbM61l6yElax/7FpVvPEfvoRfzwaR/8LWvdwz3VabJ+KTt8YSuNcXRzYHu\n1tG9uR2vfKiBnfwDATi58T+cRPKKufJKmDoVLkw/3m7vA+dOguf/YPDIy0l+3jc1a/+jl+G/+oLU\ndCa/rPPoYxoTpsCE9H27usNV6fNAPtx+iHHPBSN/AMM0WLpnKbsDuyn3lTeO8tsFHg/OWR+wbeJX\nuPitrzPj6hCDX/w2cWsDi4NBxlssuNtDjL5hsPae29k453VKx17DoOffZJBacHbqkFK22QGMAaY1\n+fth4OHm3j9y5Eh5IphJU9Z9Xidj+2MndF8us3+/lFOmpF6bO2+PRBIROWfrHDl17VS5sXrjSZUB\nLJJt2N6Pdhx3245G5brTrpES5NzzH5GxZFJuCodP6vNmHbGYDN54rfxnP+R9ZbfJp58yMq1Ru+F4\n23Zbd62tE77WDGbCxIyaNMxrIO/0PBxd25+v81AOezJo5rw9IaVk7o65RJNRzig7g8557Sdb4mHY\n7RT++02+uOpbjJn5JNy1k14vvABAMJlEEwJXLo70QyH4yldwf/QRgx77T1a5HuPOO7N/Dq690aYG\nX7ZW+Foz6A4d31gfgUUBgkuDmBGzVWe0FdmBEILBxYNxWp147Vm8jqGV8He24J/3e/hZV3jsMbZ8\nvgfPh2+yIt/ABM7yenMrBUNlJfVXXEZ83XIcv/oDvb57Jw9lWqcOSpt3sVLK96WU/aSUvaWUT7Z2\n+ZpVwzvai72rnfDaMKG1odauQpEhNtZsZHv9dgBK8ko6hLFvRAh49FE+vO5Fuq2fjjn2HIbX1BA3\nTT5vaCBqtP4G123CokXER1cwL7iOyzr/lN/F7si0Rh2advFMJTSBZ7gHV38X9i7tKJqhg2JKk2V7\nlrFm/xqqw9WZViejVDx7F+/c9R7+0Fa8o8+k8vEV7K0zmdfQQNw0M63eUWn441uEx53NZ10k9U//\nD5d98z7uUm6cjNKuvn1XPxcWb8pLFdkUwYxl9w9CcTjRZJS5O+ayo34H/Yr6Mbx0eKZVyih+P1z/\n4sVoCxdQoxdzx/9OwP7wG4QMg9WhLH2aTSbhhz/E/fXreaVTH9685H8Yf+F1PPaDgqxKydERaZfx\nUEbYILwuTGRLBO+ZXix57fJjtjviRpw52+aQNJNUdKmg1FOaaZWyh379EPPmseXy2/jKG/exS1vI\nXwf+kq73ZldeIyorSVx7I9b5n7Ls1q+yuP8N3H/bmXRyd8q0Zgra2Qj/ALpLx3uWF0yo/7Se+L54\nplVSHAc23UbP/J6cXX62MvZHoKinl74r3oEnnqDzG3/imkeH88FP5rI8GMwOn/7f/gann45cupSb\neY3pQ17nqQfP4bTuXTKtmSJNuzT4kN495mwfulOnYX4Dkc2RTKukOAIH0hrXR+sB6FvUF489e9Iu\nZx2aBo88QsN7n1BQAFf86RJmPPAsH2zcTyRTRr+qitg1N8INNxDv2p0v/vU3hjx9LXfdqeF3ZdPj\nh6LdGnxI7QjvG+fD3sWOsLWTFZntiFA8xKfbP2Vb3TZqIjWZVienyL9kDPlblrG9//Xc8defkvzW\n3Xw2fTrBZPLUKZFMwrPPwoABWP75Ng/zBD+8/vfs6Zbkq9+ozC5XkwJo5wYfQOgCz0hP46Ks+N44\nRiQLHn87OJUNlczZNodwIsyoslH0LOiZaZVyD5+PLu+/yIe3/ovz92/H/PGP+fv132bzjEVtW6+U\n8MEHJE8fCd/6FvEBQ6ifuZjoU5cxcuIu+hb1pVdBr7bVQXFStHuD3xRpSIJfBKn/pJ5EdSLT6nRY\nKhsqWbJ7CV67l3O7n0tJXkmmVcpZ/H646dlzKFo4n2TXWyjYvIqiq8YTu+wa/nLPbKr2t85OSQAY\nBg0vv82ebhVw6aWEdtVzHX/jV1fMYFvfJOdfvYOKnv0Y4B/QenUqWpUOZfCFLvCO8SIsgvrP6wlv\nCLfa1mGKY2PKVJhsqaeUwZ0GM6bbGJxWZ4a1aifY7Yx64X42X/ce1nu/hzlrDhe9fgXmsNPh17+G\n7dtPrlxgTHuhAAAgAElEQVQpYfVqwt99mEBhOd5J1xKobODD614ksXI9o6dcxy13JKiJ1NDf35/+\n/v6t+7kUrYrIJoNXUVEhFy1q48dRwEyahJaHiFXGsBZb8Y7yZv2GKrmMKU021WxiR8MOzul+DhYt\nM2GyQojFUsqKTNR9qtr2AVZvrufN3/2Ly1e+xoiPPkCTksSwkSTHnMOM+grG3nc6BaeVpbbcbJpx\ntKYG1q+HtWuJ/vsTYu9Px1e3HVPT+Zd5CeHr72DHyKu54y6dgkIDTWgIIUgYCay6SnGcKY63bXfI\nAHXNouEZ4cHqt5KsTypj34YEYgGW7llKfbSeMm+ZeqI6RQzs6eWmn17N+vCF/PCFPSQf+4AH69+l\n5MVnuTwZhb+k3iftdmSeh0Qwhs2MIhJNXJ3OfKZHzsd79UOMeOIrrH2/c+N+xgkjwec75+O1exla\nMlQZ+xyhQxr8AzjKv8yumWxIEquM4ervUh1AKyClZFPtJtZVrcOiWdRCqlOMEIL+Lhc+XSd0o2BG\n4V2Er7qfegnv/fcavFuX89k7e7lhzD5ssQAff+7grPMcRNx+/ue9flz9/b5c/f0+bH5VZ9IkKPLD\n5MGpsqPJKPN2ziMUD9G7oHdmP6jihOjQBr8p8X1xIhsjxPfG8Qz3YPGpr6al7ArsoiSvhCGdhmC3\nqBxHmaCz3c5l3XQ63RDA4TTwOxzc8cxQqqqGsmkM9E5vjmO8BH3S5+e+BFc3swtaXbSOhZULSZpJ\nRncdreLsc4wO6cNvjvi+OMEvgpgxE1c/F84+TjXaPwFiyRjrq9fT398fm27LOr9uR/LhH4ohJXra\nV783HidP1094B62EkWDGlhlYNSujykapBXJZhPLhnwS2Tjbyx+cTWhEivC4MGrj6qPz6x8IwDTbX\nbmZjzUZMaVLsLqZzXuesMvYdnQPG3pSSFcEgcSkZ4HLR0+E47m0irbqVEaUjyHfkY9Ntbamuoo1Q\nBv8QNGtqQtfWxYbVnzJYyUASzaGhWTtUFOtxsaN+B2ur1hJNRumc15mBxQPJs+XW5vIdCU0Ixvp8\nfBEMsioUojIWY1heHt5m9pWNG3GW7l5KV29XyrxlKglajqMMfjPYO3/pcw4sDiBjEtdAF/Zu9vaz\ncXYrUBmoxGFxMKJ0BEWuokyrozgOnLrOmT4flbEYq0Ih5tTVMT4/n7xDjH5NpIbFuxYTN+Jqwr2d\noAz+ceAZ4SG0IkTwiyCRzRHcg93YijveI60pTSobKtlUu4nRZaNxWp2MLB2pXDc5SpndTierlcpY\nrNHY1yQS+HSdzbWbWFe9DpfVxdldz+5Yu421Y5TBPw4sXgu+sT5iu2OE14RpmNeAZ6Snw+yuFUvG\n2Fa/ja11W4klY3jtXuJGHKfVqYx9jmPVNHo4U6udo4bB5w0NhCP7CdatYkhBd04vPT1jC+UUrY/6\nT54A9lI7thIbsR0xbJ1TI/z4vjjCKrAWtE/DFzfizNgyA8M06OTuRM/OPZUftx0ipSSeDDHK42G1\nrhOXgnpXJyrjSbrZdTTlxmwXKIN/gghN4Oj+5YKt8Lowybok1mIrzl5OrMXWnPbxRxIRdjTsIJaM\nMaRkCDbdxqDiQfhdfjUZ206pjdSyct9KAvEA5/c8n3N8PvY6nWyIRFgeDFJgseC1WJBS5nTbViiD\n32K8Y7xEt0aJbonSML8BPU9PTe52zh13TzgRZndgN3uCexrz0he7ixt/4D3ye2RWQUWbEEvGWFO1\nhh31O3BYHAwrGYbDkhrMdLbb6Wy305BMNkbwLA0GMaSku8NBsTW3BzYdFWXwW4hm0XD1ceHs5SS+\nO05kUwSZSC1mMxMmRtDIOnePKU3qonX47D50TWd7/XY2VG/Aa/fS39+fbt5uKotlOyeWjDFzy0xM\nadKnsA99i/oe0VffNFzTpWlsi8XY09CATdPoYrPRzW4n35pd7VvRPMrgtxJCE9jL7NjL7I0JwmI7\nYoRWhdA9Oo5uDmxdbOjOE1vd2BpIKQnEA1SFq6gKV1EdriZpJjmz65kUu4vpkd+Dcl85LqtaZNae\nMUyDmkgNxe5i7BY7fQr70MXTBbfNfVz3D3C76edysTceZ1c8zvZYDAHkW61IKdkTj+O3WrFqar1K\ntqIMfhtw4FHXXm5HWATR7VFCq0OEVoew5FvwjvGiWdruRxFJRKiP1eO2uvHYPdRGa/ls+2cAuG1u\nyrxlFLuKyXfkAzQ+xivaJwkjwbb6bWyp3ULMiDGh1wQcFgd9i/qecFmaEJTa7ZTa7SRNkwN7x9Um\nkywKBBBAgdWK32ql0GKhwGLBojqArEEZ/DZEs2g4yh04yh0YIYPY7hhGwGg09qFVIQCsxVasRVaE\nfmI+UcM00DWdhJFgTdUaArEAgXiAhJFKcdunsA8Diwfis/sYXjqcQmehGsV3IKLJKBtrNrK9fjuG\naVDsLmZE4YhW6+AtmtZoQAosFsb6fOyLx9mXSLAhHEYCo7xeSmw2AskkNckkXl3Ha7E0pnpQnFqU\nwT9F6G79sLw8RsQgsTdBZHMEoQkshRbsZXYc5Q5MaWKYRmOc+5baLYQTYUKJEOFEmHAiTLmvnNM6\nnYau6ewO7CbPlkcXTxe8di9euxef3ZeqW9Pp6u16yj+z4tRjSpO4EcdhcZA0k2yr20YXTxd6F/Zu\n08VTQggKrVYKrVYGAEnTpDaZpCA9B7AvkWB1KNT4freu49F1hrjdOHSdmGliSolD09RkcBuiDP4p\nImEkiBtxEmb61UhgG2jDP9xPoibBqjWriOyMEG+IE4vHiCfjlKwtYVCvQehenbX71yLzJG6nG7fV\nTSd3J4qcqVQGmtC4qM9FGf6EikxhSpPqcDW7ArvYHdyN3+WnoksFebY8JvaemJFEZxZNo9j2Zb29\nnU5KbTYakkkaDIP6ZJKQYTSO9LdEImyIRNCEwKlpONLHELcbq6YRTCaJS4lVCGyahlUItTbgJMgp\ng39gMlQiG891LTUJmjASmNJEIhvfqwmtMQ97KB7CkEajTCKxaJbG2PKaSA1JM4kpzcbDrtspdhcD\nsLVuK3Ej3iiTUpJny6N7fncAluxeQjQZJWkmMUyDpJmkyFXEiNIRAHy89WNiydhBn6ckr4TismJs\nxTaC4SB0B7fFTaGlELtpx+61E9sVQ26TDDeGY9EtuAa4cPVwIQ1JbHeMRCKB7tbRbMpP2hFZs38N\n2+q3kTASWDQLJXkldPd1b5RnU1ZLl67j0nU6H0HWxW7HqeuEDIOoaRIxTeqSyS87hGiUrdHoQfdY\nhODCwkJ0IdgWjbI/HsciBBYh0NOvfZxOhBA0JJNETRON1DyELgQa4Ek/gSRNE0kqq6iAdvuUkTMG\nf/rm6UQSkYOudXJ3YnTX0QDM2jqLaDLarHzujrlHlS/etfgwebG7uNHgb6je0CjXhIYmNDq5OzUa\nfMNMdSYOiwNd6Fg0Cz6Hr7Gsgf6BCCGwalZsug2rbj3ox3h297MP/9DpfFVGxMBoMEg2JLEWpVw8\nRtAguDTY+FZhFSm3UT8XthIbZsIksT+B5tRSh109KucyUkrqonVUhauojdZyRpczEEIghKDEXUIX\nTxeK3cVoIjc7fm96cVdz9HY66WyzkZCSuGkSl5JEkxz/MdMkaBgkpSQpJQapVNB9XSk36pZolO2H\ndBgAV/hTG7isCocPkmvpDuGSotRT9Op0ZtEDnYEABHBeQQEAG8Jh9sTjh8nH+FI2YEskwr5EggO/\nwAOvZ3hTbrZt0ShVTbaXPCAf4UntObA9GqWLzdbiCfCcMfi9CnqRNJOI9FchhDhoAnKAfwCGNBCI\nRsPmtHwZSz60ZCimNBtlAnHQLkxnlJ3R+FRw4Ggal3x+z/MbN2w+EmeUnXFU/bv5up3gJ/4S3amj\nO3VsJV92ELpHJ/+8fMyQiREyMIIGRtiAdHtI1icJLA4cVI6wCvJOz8Pe2U4ymCS6OYqwCTSbhrAK\nhFVgybegO3SkKZEJmbquNoFpRAjx38AVQBzYBEySUta1VX17g3vZXLuZumgdSTMJgM/hI27EsVvs\nDPAPaKuqs4oDTwfN0c/lop/r4Dkys8nmTv2cTsrtdsz0dUMe8AWkKLPZ8Og6hpSN72kq9+o6CZst\n7R2g8TiAJe1qaio3m8iT6Y7qwD2HbjsVNU0akskjygBChnHE6ydKi3a8EkJcD/wEGAiMklIuaiJ7\nGLgLMIDvSCmnHau8TO8K1J6QhsQIGZgREzOaPuImjnIHFp+FeFWc4OIgZsI8qIV5zvBg72wnvi9O\nw/wGILXGQFgE6JA3LA9bsY1EbYLw2jBCF6noIj2ddqKHA4vX0hiVJIRIdUIiJbcWW9GdOkbUIFmX\n3kA+LUOkOjLNqmEmTMyIyYGh0oGOVnNoCF0gTYkZT3fgB4ZTgLCIZjvl1tjxSghxITBTSpkUQjwN\nIKV86Fj3Nde2TWk2Rlc1xBoIxFKvZ5SdQb4jn92B3Wyo2UCBo4AiVxF+lz+r3DSK7OBU7Xi1EvgK\n8PtDKh8E3AgMBroA04UQ/aSUxuFFKNoCoQssXgs0E5hh89sovKgwNSJJSGQy9aq5Uo8Iep6Oe4j7\nIJk0JJo9/QghU52KjMvU04AhwQBbacoYJQNJwmvCh9XrHe1Fd+ok65IEFgYOl4/yYiuxkahOHFk+\n2outk434vvhR5W2FlPKjJn/OA65rSXn7QvtYWLkQSLkK82x5+F3+RtdMqadU5aJXtBotMvhSyjVw\nxAmOq4C/SiljwBYhxEZgFPB5S+pTtD5CCIRNwCE2UnfpOHs0n17BWmglf1x+s3JbiY2iy4qQpkw9\n20qQpmycXLYWWck/Jz81+W6mZEgaN4+35FvwVHgOenaWUqJ7U4/1Fq+FvKF5qfubvEfPO6Urme8E\n3mhJAYXOQiq6VOCxe3Bb3WqeRdGmtJUPv4zU6OcAO9PXDkMIcTdwN0B5eXkbqaM41RxwtTTn/9es\nGpqv+Qko3aGjlzZvvHWXjt69bYy7EGI6HDGY5BEp5bvp9zwCJIHXjlLOMdu2TbepEbzilHFMg388\njb8lSCmfB56HlJ+zpeUpFC1FSjnhaHIhxB3A5cAF8iiTYKptK7KNYxr8YzX+ZqgEmoaldE1fUyhy\nGiHExcAPgHOllIdPUigUWUyLonQaCxFiFvD9A1E6QojBwOuk/PZdgBlA32NN2goh9gPbWqzQieMH\nqjJQb2uQq7pnQu/uUsrilhSQno+yA9XpS/OklPccx32qbZ8Yuao3ZHHbbmlY5jXA/wLFQB2wTEp5\nUVr2CKlJrSRwv5Tyg5OuqI0RQixqabhepshV3XNV71wjV7/nXNUbslv3lkbpvAO804zsSeDJlpSv\nUCgUitYjN9dhKxQKheKEUQY/xfOZVqAF5Kruuap3rpGr33Ou6g1ZrHurTNoqFAqFIvtRI3yFQqHo\nICiDr1AoFB0EZfDTCCH+WwixVgixXAjxjhCi+UQxWYAQ4mIhxDohxEYhxA8zrc/xIoToJoT4WAix\nWgixSgjx3Uzr1N5RbbvtyZV2rXz4aU427W0mEELowHpgIqk8RQuBm6SUqzOq2HEghCgFSqWUS4QQ\nHmAxcHUu6J6rqLbd9uRKu1Yj/DRSyo+klMn0n/NIpYPIVkYBG6WUm6WUceCvpDKUZj1Syt1SyiXp\n8wCwhmYS6ylaB9W2255cadfK4B+ZO4GsXRlMqiHtaPJ3s9lIsxkhRA9gODA/s5p0KFTbbmOyuV3n\nzBaHrUFrpb1VtBwhRB7wd1JpNxoyrU+uo9p2dpDt7bpDGfzWSnubBeR0NlIhhJXUj+I1KeXbmdan\nPaDadubJhXatJm3TpNPePkMq7e3+TOtzNIQQFlITWxeQ+jEsBG6WUq7KqGLHgUht6fQKUCOlvD/T\n+nQEVNtue3KlXSuDn+Zk095mCiHEpcCvAB34YzpZXdYjhBgHfAKsILX5IcCPpJTvZ06r9o1q221P\nrrRrZfAVCoWig6CidBQKhaKDoAy+QqFQdBCUwVcoFIoOQlaFZfr9ftmjR49Mq6FopyxevLiqpXva\nniyqbSvakuNt21ll8Hv06MGiRYsyrYainSKEyMQm4oBq24q25XjbtnLpKBRNEEL8UQixTwixshm5\nEEL8Jp3JcbkQYsSp1lGhOFmyaoR/NOJGHJtuy7QaivbPy8D/Aa82I78E6Js+RgPPpl8VrU1DAyxe\nDIYBmgYOx+GH05l6tdtT71EclZww+FJKZm+djcPioHt+d8o8Zeianmm1FFmEETWIbYthKbJg85/8\nwEBKOSed/Ko5rgJeTacnmCeEyBdClEopd590pYqDqKqCjx79hBtfuwKtof647zOtNhK6A6vHgbQ7\nqIs58XVyIB0Odtc66Nw9db55l4MuvZxs2WWn/2AL6Dor11oYPEwH3cKylTrDRlpA01n0hYWKUTpS\n15m/yMJpw3RWLJecOVqClMyfLxl9hgQkC+eZjDojdX3RQknFyNT54kWSQX0TbFgVZ9jgBCKRYM3y\nBAP7xBGJBJvWJehTnoBEnB2bE5QWJajak6BLURziMep2Ryl0RdH79IRp01r03eaGwUfSp7AP2+q3\n8cWeL1i1bxXlvnJ6FfTCaXVmWj1FFhDdFCWyOYKrv6tFBv84aC6b42EGXwhxN3A3QHl5eVvq1K54\n6SXo9+wvCHucfHDXX/n1H/K475sGFiPGn16M8vVbolgSEd59M8oNV0axJKLM/CDK4G5Rdm2OMH5Y\nFEsyysrFUUZ2imIJRNm2OYolUYslGUXbHSW2LkppNIpcYaCZSQZEDayfJ9GkwZlGEm1GakHqudCY\nW/QCgKlQAvDuwdcAzgP4F1/el15jew7Ah1CAhpxjxdBtdI9ZMZdbMSw2HHVWgjusmLqN+j1WkvlW\n9tdZARtJi5cv9tgZcLqDQSO6t/i7zQmDrwmNngU96VnQk5pIDVvrtrKlbgsFzgJl8DsgUkrie+JE\nNkRwDUoZeEdvB46eDnRX9jz5SSmfB54HqKioUEvaj5M7r6kl/+EPiN/6H5z304vZ2h8mTkrJtvaD\ns9LnqypgWPp8wUsw7ErYNhW6pq998BJMSJ8vfAlOS59PfQmuvBKmToVJ6WsvvXTI+ddMMAxefcng\n9puTCNPg9VeTXHKhwYfTBDfdLEAIXv+L4OZbBGgaf35NcOttAoloPEcIXv2T4LKrrUz9l37E+t5O\nnwtgZlq3eVNhYFq+6SU4ZxLgb/l3m1WpFSoqKuSRIhmqqr78gvzpDx1JRHBYHAgh2FC9gbpoHQP8\nA/DYPadYa8WpQkpJrDJGZEMEI2igu3Xcp7mxdTq+Eb0QYrGUsuI43tcDeE9KedoRZL8HZkkp/5L+\nex0w/lgunebatuII/PWvcNNNMG8ejFbTI8fD8bbtnJjlmPrUap7/wQZeeunLa06rk1SCOtA1napw\nFbO2zmLJ7iWE4qEMaapoSxrmNhBcGkRoAs9ID/nn5R+3sW9FpgK3p6N1zgTqlf++lalMZ0MeODCz\nerRDcsKlc8v6x7iTt0j+aTihhht4PXE913y/d+Nov1dBL7p6u7KpZhNb6rawK7CLQcWD6FXQK7OK\nK1qMEUqN5AHsXe04ejqwldoaO/sDVFXBa882MKnbdLy3XAFW60nVJ4T4CzAe8AshdgKPAVYAKeVz\npDyzlwIbgTAw6aQqUjRPVRVYLOBRT+utTU4YfPvvfgnnj8Xy5ptYnniYb/Awe/48kuA9t/Jy8lZu\n/LYfv9/GwOKB9CroxdqqtXhsqcZiShOBOMxAKLIbM2ESXhcmujWKZ6QHe6kdR3fHQe+pqoI3f72b\n2z3vEHrhbe7dOAcbCeg+E84776TqlVLedAy5BO47qcIVx0dVVcp3q36zrU5OuHTo2hXuvx/mzqVm\nyVY+vuwXFPkh7z8f4BuPl1F1wVfho4/ANLFb7AzrPIxid2qV8dqqtXy24zMCsUCGP4TieIlVxqj7\nuI7oliiO7g6s/kNG67t2wW9+Q2TUOdzzRBl5D91Hmahk6fgHqHt3Npx9dmYUV7QOBwy+otXJDYPf\nhMLh3Tnvve9hXbaI2tnLWTHuXvpumw4XXYTRoxf84hdQV9f4fp/dRygeYs62OayrWocpzaOUrsg0\ngWUBAksCaA4N39k+8obkoVk1iMfh738nPvEyzK7d4LvfpdRZx9yJP6H201VY1q9h9MdPk3/lOSl3\ngCJ3qa5WBr+NyDmD35SCc4ZQ8cmv+PVDu7iBN6i09oTJk4mXdCXyje/Apk2Uecs4r+d5lHpKWV+9\nnjnb5lAfPf7FHIpTi9VvxT3Ije9sH9Z8K6xfT+TeBwkXlsF11xFb+AX/JR/mxe+vxbJqOeM+epSC\nsYMyrbaiNamqgqKiTGvRLslpg3+A279h54wpN+Ca/zGv3L+Uv8SvxfbSc9C3L1x7LbblqxhROoLR\nXUdjmAaS7AlF7ehIQxJYFiC6LQqAo6sDZy8HYvbsVEDygAHYXvg/3g+dy1t3vk9s3TbsU57g6of6\nZ1hzRZuhXDptRrsw+H4/TJ6cer3skdPZN+UV6pZtI/zAI0TfnwEjRsBVV9Fp7Q7O73k++Y58ALbW\nbSWSiGRY+45LMpik7pM6YjtimHETkkn4859h5Eg47zzCMz8n/OCPqftiO1umvMX4py/BX6I3/q8V\n7RDTVC6dNqRdGPymHDD+RaeV8tvOP6NzdCufTnwcc/YcqKggcdEVsGwZ0WSUNfvXMHvbbPYG92Za\n7Q5HrDJG/Zx6ZEzirXDj+vytVNz1bbdRtSvG1CteoCi0nd+W/JSiwZ2Vke8o1NenjL5y6bQJbWrw\nhRDdhBAfCyFWCyFWCSG+e7JlJU2TRPpIpg+jySphQ8qDrhtS8rU7JI9MyWfA64/y6+9t5WHtCeJz\n52FUVGC965uMoztOi5MFlQtYs38thmliStl4NF2FLNN/H3ocSa44OonaBIElASx5Al/l+9jOHQZf\n+xq43bxz+zsU713JkhFf56dTnI3LzxUdhKqq1Kvq3duEtg5nSALfk1IuEUJ4gMVCiH9LKVefaEGz\n6uqImAdH2HSy2Rjt9QLwcW3t4XK7jcmTU/Ly2wyWl3yTd8+6FfvUt7B8MJXO193EuIsmsuLrV/LW\n9iW49+2gb8nwI5Y/40jlH0NebLVyps8HwPSammPfbxgH33+IPHqE8kel5TOb1C+ayM9oIj/S/Wc0\n+f6OJK9Iy2cdQe5vIp9dV9eo/4E1D36rlZHpxTOz6+oa7xdSQnAxRf/3S0Z+NI3koCE8/f136Xfv\nWSA0vn5WLYMvhN5+K/70/Z80uf8ARVYrI9LyT9PyPk4nPZwqv1LOogx+m9KmBj+95Hx3+jwghFhD\nKrPgCRv8fi4XyUNGz84m+a/7HkHuaiIfWeJk2K0ScPFC3r28uvlqXun9C7RfPMPQF18i+POHSFw+\njK4u15f3618m4urtdJKUB0/3upvIe6XlzdXfy+kkcYjc3UTew+EgcYhBa1p+d7v9sPrzmsi7HYf8\n0PqbysuOIS+12w/Tr6m8s81GwjQPqt/TRN4poRFZGkFz7EZ7/hn4/HNMezENL77J76uu5ce/i/BA\nd8kdd0D/Ww6/32+1Ej9Ev6byQquVuGke9D/LBeoSCZYEg3Sz2+lqt+PMMf1bnerq1Kty6QApz0F1\npJpdgV0M6TSkxQtIT1nAcjoh1XBg/sncX+5wHFXe/RjypqO+yTeDP9abuaFnmfzJPfyz4H7G3fMQ\njHgDfvtb9p7WE01oFNu/3CKy5zFGjb1aKO99DHmfJh3RkejbQnm/Y8j7t0CeqEtQMrMa+fLLeKf9\nBmu+YOa4R7n4n9/iyRobk+4CNDeTbgR/3pHLGOh2H7X+QceQZysScGgaa8Nh1obDFFutdLXb6WK3\no3XElabBYOq1g6dViCaj7Kjfwfb67YQTYay6lZ75PVucHPKUGHwhRB7wd+B+KWXDIbJTnjP8wMRu\nVRW43cNw3TGThn+8gfj+9/CMGcOGey6lbtJNDOl3Nt3zW56DuiMT3xcj8PS7aC8+ize8mGVj76Ln\nH/+ToQWFPNkkA+rkyZnWNDMUWK2c5fMRNgx2xmLsiMX4IhSixGZDE4KkaWLpSDs5hdKJD48xwGjv\nbKndwsaajfhdfgb4B9A5r3PrbPrU3GRkax2kEk9NAx481ntHjhwpM8WUKVLm0SDnnztZxq26nN3T\nLd/4r3vk6j0rM6ZTrhNftF5WnX6PrGWY3F5+jvy/e1dKSH3XmQBYJNu4vTd3HG/bNk1TBhKJxr/n\n1NbKT2pr5Y5IRBqmefIfPlf4zW+kBCn378+0JqeMhJGQW2u3yllbZsm9wb1SSimjiagMxoLHXcbx\ntu22jtIRwB+ANVLKZ9qyrpYyaRI8OsVDr7em8Op3VxLbMpqBv3qOjd+8jmVz/66ib06EZBL++7+x\njBuOY/0cFl55N923f8z+ToOZMgUVeXMUhBDkpVNDSCnpmp5bWRoM8u/aWlaHQoQPmdxvV3SgEX4w\nHmTlvpX8e9O/Wb53OUIIRDrkwm6x47a1vpuyrV06Y4HbgBVCiGXpaz+SUr7fxvWeME3dClc9NICX\niqdzj/v/2zvz+LjK895/33PmnNkXbZZsybIk21jewXjBxmC2EEISIC0BkqYpTmjgJi1ZekO2Ngu3\nvR9C2ty2oUtIwEkpuUlKkoakyU0JEEggxhbGxpY3bHmVLVujZWY0+znnvX/MWJZt2ZJljWZGOt/P\nZz46c96zPJLeeeY9z/u8v+cpHH/3IAN33UP8j76A7+HP5Yol25yfLVtIf/Av0Np/y/6F76Lqe49x\nxYwGvnpWARubkRFC0Ox20+x2E85kOJhK0ZFM4lIUWtxupJSTTwU2kcj9nOSZVpa0eOXwKxiWwXT/\ndJpDzVS4Kwp/49E8BkzUq5ghnfPx2BdPyKd4n5QgY63z5Hc++tJUetocPfG4jH/sf8oB6uXJ4K3y\n2dt+LMEqWvhmOCiDkM5IJA1DZkxTSinlkWRSvtzXJztTKWlNlnDPpz4lpcdTbCvGHcuyZGe0U7Z1\ntk6lqbIAACAASURBVA3+r7rj3TKVTY3L9Ufbt21ZwRG4+8+nscH3PfobPsArf7Oexv9ax/6t91P9\ny0chn4M+5XnuObj/fsSBND/mIyTv+VPueHg6j64VdvhmnHENSdtUhSArJa/HYnhUlRaXi5lOZ3lP\n8iYSUKYZV8NhWiaHI4fp6OsgkU3g1b2kjBRuzU21Z+Ifd8u4Z0wMp0I9offdSst/bOTNy28jceyb\nhJvnE/33Z4ttXnEJh0nd/UG4+WZi5nROfuF7RB78FHc8PJ2aaaJs5RCEELcIIfYIIfYJIT47TPu9\nQohuIcTW/Ou+Ytg53enk+lCIFX4/LkVhRzzOq9HoyCeWMvH4pInfR1IRnut4jh0nd+B0OFlRv4Lr\nm67HrRUvXGWP8C+C+fObqfneEzzyl0+x/yff4I/vvZ30D+/kiaX/yF0fn16Wzm0shLslrz34NO94\n7pNoff38NX9F7Q0f5Z73ePnoMl9Zx5WFECrwT8DbgKPAZiHEs/Lc1eE/kFL+2YQbeBZCCOqcTuqc\nTnqz2UG5EUtKOpJJZrlcaOU04i/zEX7GzBDPxKlwV+B3+qnz1dEYbKTSXVls0wDb4V801Z5qPvKp\nD/Jo1WzmJn/J1V/dwPt/9hwbd/0tt/zHhyd/WbYDB4jd8j94595fcazxKtw/+RbOjYu4/W4T30yl\nrJ19npXAPillB4AQ4vvA7YxhdfhEUzmkjm93NsuuRIK3kkmaXS5a3G70cnD8Z43w08fTZLoycFbd\nIu9SL4pDId2Zb6e47RkjQ2esk2OxYzgUBzfcegOKpjDfnE9mZ4YYsUu6/tB9l4Lt8MfAZQ1VPPqp\ntbgdbyP67k8y8P77ueVHf0p27b/z3asf546HLpt8o33DIP6//wHtr7/ILE3h17d/g4Vf+RC6U+az\nmyaNJEA9cGTI+6PAqmGO+0MhxLXAXuCTUsojwxxTNGp1nXWhEHvzTv9AKkWzy8VlHk9pr+A9a4Rv\nxk2MXiMnEDXU7HyWtJW2MKLGudeZoPZUPEXHoQ5OxE9gWRbV3moaPA2Dh43r/ccjM3w0M7sT9SrF\nLJ2RsCxL7jq5U6a+9S8y6Q7JJE758tv/WnZ3puWjj5b/+pHubim/+2CbzCy9UkqQP+Xd8l8+f1im\nT6Rl98+6Zf/v+qVllkeGCKPIZADuBL495P0fA4+ddUwV4Mxv3w+8cJ5rfQRoA9oaGxsn+Lc9TTSb\nlW3RqHyxt7f0s3mWL5fyHe+QySNJaSSNYlszIkciR+TP9vxMbjm2RcbSsaLZMZq+Le0snUsnno3T\n0X+ArptamffaNiIf+DTX/Oov6b7y+zzT9W1gVfnKBkSjHLrjr/ijVx4j6Z9G8ls/YE/ve/nj9xjE\n2qI4Ag78K/0IpYRHjBdPJzBzyPuG/L5BpJQ9Q95+G3h0uAtJKR8HHgdYvnx50Vbu+R0OrvT7MWUu\nb9+wLF6JRmnOZ/WUVBguHsdsmMPAGwN45nvwzCmtCVzDMjjQdwBN1WgKNVHvr6fSXYlHKy07z0cZ\nBPVKG5/uY2X9SuKZOG8FDjJ7y7/Ds89SqfSzUazmT9vu57EvdQ+qvpYD4W7JTz/4I8x581n26jd4\nc/UDpN/YReC+u/jkAybaviiKSyGwKpArMD652AzMFUI0CyF04B7gjHQsIcT0IW9vA3ZNoH1jRs07\n9rSUqMC2gQF+09/P8XS6uIYNJZEgq+QWIOl1epGNOY0lLTr6Oni+43l2h3fTn+oHcpPm5eLswXb4\n40K1p5oV9SuIpWNs6tyE+c5bUXe1Iz7xCfzPPMkHHp7L9vVfJ3wsw9e+Rkk6/3AYvvY16HtlJ9Fr\nbuX2p+4krExDbNzIFa/+E1Wzc2UhjYiB0ASB1QEU5+TrPlJKA/gzcvpPu4AfSinbhRAPCyFuyx/2\nYL6gzzbgQeDe4lg7Nryqytp8OqcA2mIxXolEzpG/LgrxOJYrJ5mquktjXqhroIvnO56n/WQ7AWeA\ntY1rubzu8mKbNSbskM44Mc07jWXTl/FG1xv0p/qpClTB179O9L0foW/9J7n+539B79Jv8lL470C+\nk08/VEKP0cD3Hwvj+cqXCCrfJOjz8cK7vs6Sb/051J3ZRVwzXThnOBFqadk/nsic9Mcvztr3xSHb\nnwM+N9F2jTd1Tie1us6RdJqTmcxg+qYlZfEmdhMJpO5BqKLofUzmQ2ACgVtzc8X0K4qyWGo8sR3+\nODLdP51KdyVOx2m9nYrVrVTs/iX84hcEHvwkPw+/m+wzq4nMfpjH99/I+g+JomX0hMPw9D9HuC/5\nDT76z38LygDpex/A/dUvc8MQo6QlibXFcDW50KfpRf8g2owfQggaXa7BehMp0+TlSIQml4vZbvdg\nGGhCsCxIJLB0L0IrXh+LpqO0n2ynwl1Ba3Urtb5aan21RbNnPJl8z+RF5pSz74x28sbxN05la8Ct\nt+LYuR3+9V/Rjh8heOfbWPWZdbzw+V8T7pYTGuoJh+EfH+5n+51f4YNfasL7yF+hrLsWZfubuJ94\n7IzlsVJKBrYOkDmRQWZtxdCpQJWmsSeR4IW+Po6mUqf7cKFJpQDwzJQEVk68bEnKSLG1aysvHXyJ\nSDqC2zH5BNxsh18gkkaSo9GjtHe3n96p63D//bBvHwOPPMYy/z7u+tbbkEuWsPuhJ3jqm4nCG7Z3\nLwff8wn+5EuzuP6lLxNecC19v26DZ5+FBQvOOTyxO0G6M41nvgdnva0UOtlxqSpX+v1cHQziVBTe\nGBjg1WgUYyLi+3lpZDXoxhGc2ODD4chhXjjwAp3RTmZXzubG5hsnZfEj2+EXiDmVc2ipaOFA3wHe\n6nnrzEanE99nPobvZAc8+SQVVQpPcB8ff6SO1B99mP/7wEuET4yj5nlvL7G/f4JDc2+EefO48rV/\npvPyd9L3/Bbmtv+UihuvHPa05MEkyX1JXE2ukkuPsykslZrGNcEgl/t8+FR1UJCtoKP9vDRyKh0g\n25st3H3ySCkxrdznzK/nZBCub76eBTUL0FRthLPLEzuGX0AW1CwgY2bYHd6NrurnjhhcLli/Hse9\n98LLL6N85zso3/sh78s8SeLfqtjZegsz73s7/ptWwZw5MNql8ZkMbNtG/Nnn6f7B88w6+BL+bJYT\nzOa3b/9fXPOd+1hQVzfiZYweA71Wx7uofLVNbMaOEIKZLtfgooS4afL7SIRWj4eGEWpIj4n8CD8e\n9uPsTKNVFs7p9iX72H5yOyFXiCW1S6hwV0yMHn2RsR1+ARFCsLRuKVkrSzR9ARVDIWDdOli3juiX\nH+PVz/+cxvZfMOONX+L/2NO5Y4JBWLQIZs6EhgYIhUDTQFUhGoWeHujqgl27YO9eMAy8QAeL2Hzt\nx5n7xXv4yevLWP8hAaOcJPYt84GktBbm2BQNS0pc+TDPoXSaxV4vAcc4upBEAglIzYWiFyb4kDJS\n7OrexdHoUVwOF1XuqoLcp1QpuMMXQtwC/AM5sZVvSykfKfQ9SwlFKCyfsRxFnH4kvpADrZ7l5ban\n7yYcvpsNT1jcd9UOHFvb2P/9zSxgN/rmzfCTn8DZi2UqKqCmhnRLK1vq7mDh+5aSXbOO//dftaxf\nDxXV8OkbR7bXTJgMbBvAd7kvlwdt+3qbPH6Hg6uDQY6k0+xKJHi5v59mt5uF46VuGYshcYDLjdDH\nv+Mdjx1na9dWLGkxt2oucyrn4FCm1pi3oL/tRUjNTmpOOft4Js7mY5u5ou4Kgq7gBc+proZPf0YB\nlvC1TUt4aOOHBuvBbnhSsv4DWapDRq5+rNdLuE9lw4bcU/FXvgKP3gKfXpB7jRYraxHdFMVKWUjT\nzsixOZdTaZx1us7uRAJjPGP6PT1YOMDvH9cRviUtFKHgd/qp9lSzoGZBQerFlgOFnrQdlJqVUmaA\nU1KzUxJVUTEsg41HNxLPxEd93vr1nHb2G+Chzwg2PK3nZGQDAVBzzv6hh3LHj6VQ+Klceytu4V/u\nx+GbWiMfm4tDVxSW+HwsyY/uI4bBlliM9KVk84TDSDQIBMZlhB/PxHnt6Gu8cfwNICeDsqJ+xZR1\n9lD4kM5opWanBC6Hi6saruKVw6+w8ehGrm68Gpdj5MmvoQXWTzny9etz+fQb8sXBh+4fy0KugTcH\nyIaz+C73oVeXjoaJTWlzKjwZNQyOZzKczGRY4PWOTZQtHMZBnNA761Eqxu6aTMtkb89eOvo6UITC\nZVWXjflak42ip2UKIT4ihGgTQrR1d3cX25yC49N9rGpYRcbMsPHoRrLmxaWfnXL+1dUMjuo3bDhz\n/8ViZSyMXgPPZR5cMwuQfWEz6ZnpcrEuGCTgcLBtYIDfR6MMGMPovF+IcBjh9+KoGXuhj75kHy8e\nfJF9vfuoD9RzQ/MNzK6cPaZrTUYKPcIfjdRsSUjITiQhV4gV9SvYHd6NJcf+CDx0VH8pKLpC8Jrg\nZFS+tJlAfA4Ha4JBDqdS7IzHOZxOs+Bisnh6ejAqG8geSOJqdI1JwsPlcOFyuFg2fVnJlBUsJQrt\n8AelZsk5+nuA9xf4nmVBtaeatY1rAQad/qnJ3VFfY0ioZyxke7Okj6TxLvbazt5m3Gh0uajV9cEa\naH3Z3FNshTZCXn04TDYwk/iOOM6G0Qn0nZIt7kv2saJ+BW7NPfi5sjmXgjp8KaUhhDglNasCT0op\n20c4bUohpaTtWBsOxcEVdVdMWM67GTeJbY4hNIE05WQrYmJTZJxDFgnuSSTozmZpcbtp9XjOL8gW\nDiNDcwFG5ex7Ej1sP7mdWDpGna8O0zJRldKQVC5VCp6KMZzUrM1phBBUuivZ1b0LTdFYXLu44Pe0\nMhbR13ILwSZpERObEmK538+uRIKOZJKuTIalXi/V+jCJAeEwcvEqEFxwAJIxM7SfbOdo9CgezcPK\n+pWTRs2y0Ni5dyXAnMo5ZMwM+3v3o6s686rnFexe0pLENsewkhaB1QFUrz0isiksDkVhsc/HDKdz\ncEJ3ZSBA7dlOv6cHQpWjGt2HE2HmVs1lbuVce1R/EdgOv0RYULOArJllb89edFWnuaK5IPcxIgZG\nxMB3ha+gWiU2NmdTpWmsC4U4kExSk4/nZy0rV3glnc6ttA1WDOvwI6kIB/sPsqR2Cbqqc0PzDbaj\nHwO2wy8hltQuQSIJOAunBa5VaFTcWDEpyxOOFyPJgQghnMC/AVcCPcDdUsqDE21nOaIKwRxPTnk1\na1n8pr+fGk1jYTSKBrnU4DWn+3/WzLKnZw8H+w+iqzqJbAKv7rWd/RixHX4JIYQ4o1ZmykiNamHW\naEh2JBEOgavRZTv7CzBKOZAPA31SyjlCiHuArwJ3T7y15Y0qBDOdTvYlk5zcvZslFRXUNdej5Fd5\nd0Y7ae9uJ22kaQo10VrdOmlliycK2+GXKJ3RTrad2Maq+lVUeS5N0S/dmSbeHkefruNqtBdWjcCg\nHAiAEOKUHMhQh3878OX89jPAY0IIISeiNJSUOf2kTAay2VxZQClP/zx7e7j3ipJTWR3Nq4BZY4oQ\ntHq9THc62fr882y+/HLqmq5kYWcS53Sdnd07cTlcrKxfScgVKpgdUwnb4ZcoNd4a3A43mzo3sXrm\n6jF3+Ew4w8DWAbQqDf8y/zhbOSkZjRzI4DH51OMIUAVcXJHKbJbMTe/gxJEsdVUZRCZD38ksAXeG\nZCSL35VBZDOkB7K4RAayGUS28IVBhmIJBeFQkbqTlHSi+ZzEDRe+aifoTk5GXdQ0OJG6k0MnXTTO\ncSKdTvYcym3vO+Jk4bLcvrbtTq5ckzvvd5udXH1D7ryXnzd4xy/+hZ3vfR/fffIYf3aji+Z6N2tm\nrsGjeWx57nHEdvgliq7qrJ65elB3Z3XD6hEVNs/GiBjENsdQvAr+FX47136CEUJ8BPgIQGNj47kH\nqCrdh5LsO6RjOvyYqs62Lp3q6RqHenWWrtCxFI2XX9NZfa2OqWr86kWdG96uYak6//kLjdb5Cjt2\nKdx+uwAh+NF/KrznPbntZ34s+IM/VEAIfviM4M67cqG8Z35ocfkik507TO68w0RYJj9/1uT2d+a2\nf/VLk1tvNlEsgxd+bfK2qw1UM8Nrv00zpzJN98kUK+rTqEaajsMp5qtpVDNC/PAJBsK5/TW9KdQ3\n0izIpnC9kkaxTNYB/DL3q98CuWcj4N3AgWnTeDq4lF//oIu6bAUPviPI3rTFfNXCpdrx+vHCdvgl\njMvhYs3MNbx65FV+f/T3XNd03UXF9DMnMghNELjKzrW/CEaUAxlyzFEhhAMIkpu8PYMRZUMUBWfb\nK7RtgMV5eYz9G2DhbfDas/CO/L70BmjOb/92A8zPb2/aANfdBtFn4fL8vjfWwLL89rarYHl+e/tK\nWJnfbl8Ob78N0kPO27IBFg25bmt++5UNMDu//eIGaLoN3nwWqk7dY8Pp+z2XF/IzgKc3wG235Uol\nr18PmCZPfTvNB+9OQzrNM0+nee/tadKJKI//fC9z/tDFVZ4QdbEW7ryjin7D4Fgmw4m8GFtjISps\nTUHEhFWkHwXLly+XbW1txTaj5EhkE3QNdNFS0XLR51oZq2DVg8oNIcTrUsrlIxzjAPYCN5Jz7JuB\n9w9dIS6E+BiwWEr5QH7S9g+klHdd6Lp23x6e3x3+HZFUZLAgSf/z/WjVGv7L/cRNk20DA/Rks1Rr\nGkt9Pjz2aH9YRtO3wR7hlwUezTPo7KPpKAKB3zl8PN5KW8Rej+Fd7MXhd9jO/iI5nxyIEOJhoE1K\n+SzwBPCUEGIf0EtOI8pmlERSEby6F4fiYPG0xTgUx2mNevO0rIJXVVkdCHA4nWZnPE57PM6KQOFS\nlqcCtsMvI6SUbDm+hYyZYc3MNfh03xntVtYiujGKGTeR2dJ5cis3hpMDkVJ+cch2CnjvRNtV7mTN\nLLvDuznYf5C5VXNprW49Z14quDYIQwbxQghmuVzUahqnenTSNDGkxD+e9XSnCPbwr4wQQrB8Ru6p\n7dUjr55RGN0y8s5+wMS/wm+vorUpKTqjnbx48EUORQ7RXNHM7IrhNepVr4rqOjds41JV3Plwzq5E\ngpcjEfYmElglFJIuB2yHX2b4dB9rZq5BIHj1yKv0JfuwDIvYazGMiIF/uR+9xq5YZVM6tJ9sZ8vx\nLbgdbq5pvIZF0xYNu4BKWpLk/iRG9MKFUxZ5vUzXdfbkC6n3T3CqajljO/wyxKf7uLrxajRFY2/P\nXpC5cI9/mR+91nb2NsXHtMzBam4NgQYW1y5mbePaC6YWy6wkvjNOtvfCDlxXFJb5/awMBMhKye8i\nEY6mUuNq/2TFDoKVKR7Nw+rpq9EcGoqmELw6aC9QsSkJuga6aD/ZTpWnisvrLifoCo5qDYk0c+GZ\n0Va6qtV1rguF2JtMUpNX3rSkRLE/B+fFdvhlipWxyGzOYLgMlOUKmzo30RhspD5QX2zTbKYo8Uyc\nHSd3cDJ+Er/TT0Og4aLOv1iHD6ApCgu9uQwfKSW/j0bxqyrzPZ6cCqfNGRTM4QshvkZuEV0G2A+s\nl1L2F+p+UwkzZRLdGMWKW3haPVjSQpLL4ElkE8ytmltsE22mGJ3RTrZ2bUURCgunLaQp1HTRJTvH\n4vDPOB+ocDgGC60s9HqpdzrHdK3JSiG/Ap8DFkkpl5BbyPK5At5rymAMGER+F8FKWvhX+dGn6Wiq\nxlUNV1EfqGd3eDfburZRSgvqbCYvpmUCEHKFqA/Uc33z9bRUtFy0swcGU4mFY2wOXxGCBV4v14RC\nuBWFLbEYGyMRUqY5putNRgo2wpdS/veQtxuBOwt1r6mClJLYphhYEFwTxBE8/e9ThMKy6cvwaB7e\n6nkLiTxDatnGZjwZyAyw4+QOVKGyon4FXt17yf1Nq9QIXR9CdV/aatqgw8HaYJCDqRQHU6nz19Cd\ngkxUDP9DwA8m6F6TFiEEvit8KE4F1TP8h6K1uhWP5iHovDihNRub0WBYBnt79tLR14FDcTCvavzK\ncQpV4PCNj0sSQtDsdtPkciGEwJKSLbEYzW43VdrUXaNySX9dIcSvgbphmr4gpfxp/pgvkNdTOs81\nLqwoaENiXwIkeOZ60CpG7qyNwdN/xz3hPVR5qqj2VBfSRJspQE+ih9ePv07aSNMYbKS1uhWnY/xi\n5JlwBjNq4m5xj9s1T2WuJS2LiGnyaiTCTKeTBV4v+hSc1L0khy+lvOlC7UKIe4F3ATeerzjEiIqC\nUxhpSga2DZDuTOOsv/gPlmEZHB84zlu9b7GgZsGYxNdsbEzLRFVUvLqXgDNAa31rQQqSZLoypI+m\nx9Xhn8KrqrkUzkSC/flJ3Xkez+ATwFShYF9x+bqgDwG3SSkThbrPZMVMmURejZDuTONp9YypeIlD\ncbC2cS11vjraT7bz+rHXBxfD2NiMRDwTZ3PnZjYe3Qjk5LqvariqYNWnZEYWVOxPFYL5Xi/XhUKE\nHA46Uimm2gizkDH8xwAn8Fz+G3SjlPKBAt5v0mBlLSIvRZCWxL/Cj7Nu7I/NDsXB8hnL2de7j93h\n3UTTUdY1rRtTFoXN1CBrZtnbs5eD/QdRhMKcyjlIKQs+ErYyFkIv/Gjb53BwVTBI2rJQhMCUkp3x\nOHPc7kG9nslKIbN05hTq2pMdRVPwzPegVWmo3vHpgHMq51DpriSeidvO3ua89CX72NS5iYyZKUic\n/kLIjERxTVzfdOZj+P2GweF0miPpNHPdbma73ZN2ta690rZEMAYMBrYO4Gn1oFcXpth4pbuSSncl\nAMdjxznQf4CltUtPa5HbTEmklKTNNC6HC5/uo9JdybzqeQScE6s9b2Us1MDEj7CrNI3rQyF2xuPs\nTiQ4nE7T6vFMykVbtsMvMlJKUh0pErsToII0JiaqaEmLSCrCS4deYn71fJpCTVNq8somRzgRZmf3\nTqSUXDvrWjRVY0X9iqLYElxbvFRij6qyPBCgO5NhZ35id4auT7rPhO3wi4gZNxnYOkC2N4tep+Nd\n7B1WC7wQ1AfqqfJUsa1rGztO7uBY7BhLapect5KWzeQikoqwK7yL7ng3bs1Na3VrsU2asL5/IWp0\nnWs1jbRlIYQga1lsj8e5zO3GNwkKrpT/b1DGpI+nMWIGvit8uBomvkizy+FiVcMqjkSO0N7dTl+q\nb0o7fCFEJbkFgk3AQeAuKWXfMMeZwPb828NSytsmysbx4MTACTZ1bkJTtTHr3ow3VtYidSCFPl3H\n4S+uWxJC4MpP3vYbBicyGY6l08xyuZjn8ZR1/r7t8CeY9LE0QhXotTruFjeumS4UZ3E70MzgTOp8\ndTiUXHc4Gj2KlJKGQMOke6Qdgc8Cz0spHxFCfDb//jPDHJeUUpaVbkUimyBlpKh0V1Ltqaa1upWm\nUNOwhUiKQbYnS2JPAkeFA0pozFGj69xQUcHeRIJDqRRH02la3G4uc7vL8rNhO/wJItuTJbE7kQvf\n1OrotTpCEQhnaXSaoR/8o9GjdMe76ejroLW6lVpfbREtm1BuB67Lb38X+A3DO/yyIZFN8FbPWxyJ\nHsGn+7iu6TpURS05RdXMsQyKrqBVlcYX0FCcisJin49ml4vdiQS92SzC4wGYkHTV8cR2+AXGiBjE\nd8XJdmdRXAq+JT6cjaU9+7+qfhXHYsfY07OHTZ2bqHRXsnDawoItuCkhaqWUx/PbXcD5vulcQog2\ncpIhj0gp/3OsN7SyFkb/uSX9HAEHilPBylgYkXz7kPl8NZCr/Wplhj8/686yP7Gfw92HEVFBY6CR\nJm8TmROZ3PnB0+cPV2HKEXLk2tPnaa8Y0t5znnZ3vj08THvl6fZMV4ZMVwZngxOhlK7z9DkcLA8E\nBuvopkyT30Uig5o95SDSZjv8AnHqm9+IGJgRE+8CL64m15i1vicSIQT1gXqm+6dzOHKYvT17SRm5\nEnKWtIoe770ULqT/NPSNlFIKIc6XMjVLStkphGgBXhBCbJdS7h/mXiPqRBn9BtGN0XP2+6/045zh\nxIicv12doebaXzu3PTo3yhHlCDPFTKadnIbWo5E5kCFD5pzzY5tj579+1CDWNkL76+dpd+fbt1y4\nfeDNAVSfinv2+EsqFIJTOfom4FNVdsbjdCSTzHG7aSxxxy9KSTd9+fLlsq2trdhmjBlpSTLHMyT3\nJ3E2OHG3uJFSIk2J4ihfJ2laJopQEEKwJ7yHroEuWipamOGfgaoUP7NitAghXpdSLr9A+x7gOinl\ncSHEdOA3UsoLykEKIb4D/FxK+cyFjjtf37ayFmbsXL121aei6EqufWCYdu+Z7bF0jAN9Bwi5QzSG\nGhFuQVbJ4hTOM84/FX5QPAqKpmAZFlbcGvIL5X4o7iHtCYuzOaM9OUy7K9cuTYmZPNd+xaWgOHLt\nVspC8ShlFRoZSk82y55Egp5sFl1RuCEUmvBqWyP17VPYI/xxwBgwSB9Kkz6azi0e8amDKwaFEGMu\n6FAqDHXqfqef4wPH2dq1lfbudhqDjcwKzposi7eeBf4EeCT/86dnHyCEqAASUsq0EKIauBp4dKw3\nVDQFpfL8zkHRFJSK87f3G/3sS+zjxMAJHA4HwUAQLZSLgzvyH28ldIHrOxSU4AjtgRHa/edvH0ny\nWKhi3FaTF4sqTWNNMEhvNks4mx109p3pNNWaNriitxSwHf4YsbIWipb7Rw5sHcDoN3BOd+JsdKJV\na2U7WhmJGf4ZzPDPoCfRw4H+A3T0dRBLx1jVsAo4raxYpjwC/FAI8WHgEHAXgBBiOfCAlPI+YD7w\nTSGERU588BEp5c5iGPvmiTc51H8IXdWZVz2P5lBzyWTdTEUqNY3KvNZ+xrLYOjAAQKPTSYvbjbcE\ndHpsh38RmEmTzIkMmWMZjD6DipsrULTcRKziVIqeXjmRVHmqqPJUkTJSgwqcKSPFCwdeYJp3GvX+\nemq8NYOpnuWAlLIHuHGY/W3AffntV4HFE2wakPsyPRI9wgz/DHRVp85Xh1/30xhsLOcv2UmJrihc\nFwqxL5nkcDrNwVSKWl1nvseDv4gLuMrn01hEMt0Z4u3xwVir6lNxzz09weQITN0/o8vhwuU4N0WB\nxwAABrtJREFUvWisMdhIZ7ST47HjKEKh2lPN/Jr5E67LMplIZpMc6D/A4chhsmYWRSg0BhuZ5p0G\nkyKSNjnxqipLfT5aPR4OplIcSqUGJ3xTpommKBM+wTt1PdUwWFkLo9cg25vF6DVwz3Hn8uU1geJS\ncDW60Gq0oq8ELFVcDheLpi1iYc1CepO9dA10cSJ+AlXkRp8nBk7Qneim2lNNlbvKDj+MgCUtthzf\nQtdAFwDTfdNprmgeFMCzKQ+cisI8j+eMxVrb43F6sllmuVw0ulwTFu6Zsp7LTOVH6y4VM2kS/X0U\nM57bJxSBGjz9D9BCGsGr7Bqxo0UIMRjyWcjCwf2xTIzDkcMc6DuAEIKAM0DIFWLRtEVlneo5nmTN\nLP2pfmq8NShCwZIWsytm0xRqwq2VR9qizfAMnddrcef+l/uTSfYlk1RpGi0uF3UFVuic1A7/VC68\ntCTJ/UnMuIk5kHvJrMTd4sa70IviVHAEHThnOtEqNRwhR1nky5cbcyrn0FLRQl+yj3AiTG+yl3Ai\nPOjs3zzxJvFMnIAzQMAZwO/049f9UyI+3Z/q51D/ITpjnUgpuXn2zWiqxsr6lcU2zaYAVGkaVZpG\nyjQ5kk5zOJ2mxzCoczqRUhI3zYKItRXc4Qsh/gL4W6BGShkej2tahoXM5NYPqJ6cM0i8lcBKWFgp\nCzNpYiUt9Dod/xV+hCJI7ksiHALVp+Kc4UQNqGiVuZCCUAT+K0tIwGMSowhlcPR/Ni6Hi/5UPwf7\nD2LJXG63V/dyQ/MNABzsP4iUEo/mwat78Wiesn8y6En0sOPkDqLpKKqiUu+vZ1Zolh3umiK4VJW5\nHg9z3G5OrWYIZ7NsjEYJORw0OJ3McDrHLbWzoA5fCDETuBk4fKnXivw+ghk3kWmJtHLOXq/VCazM\nTQamDqZA5hZ0qF4VrVobdOgAlW+vLOll2zZwWdVlXFZ1GVJKEtkEsUxs0PFDzuHH0meu2qz11Q6O\ngvf37ifkCg37ZVKqnMpiWlK7hPpAfVllNdmMH0IITj3HBh0OFnq9HE2n2RGP0x6PM03XWeL1Dqp4\njpVC967/Q66Q+TkLWC4W1ZNbzKQ4FYQuUHQF1Xf6l6+4qeKCue+2sy8fhBB4de85i7mua7qOtJEm\nkU2QyCaIZ+M41dMxzwP9B2ipaCkrhx90BVnXtK7YZtiUELqi0OJ20+J2EzMMjqbTnMhkxkWWuWAO\nXwhxO9Appdw2HouQfEt9I93vku9hU/o4HU6cDicV7opz2m5quYlSkgqxsblU/A4H8x0O5nvHJ//2\nkhz+CEJUnycXzhnpGiMKTNnYjBb7i9/G5vxcksOXUt403H4hxGKgGTg1um8AtgghVkopu866xuPA\n45ATmLoUe2xsbGxszk9BQjpSyu3AtFPvhRAHgeXjlaVjY2NjY3PxTIg88mgdvhCim5xo1URTDZTr\nl1G52l4Mu2dJKWsm+J6A3bfHQLnaDSXct0tKD79YCCHaRqMlXYqUq+3lane5Ua5/53K1G0rb9vJe\ntWJjY2NjM2psh29jY2MzRbAdfo7Hi23AJVCutper3eVGuf6dy9VuKGHb7Ri+jY2NzRTBHuHb2NjY\nTBFsh59HCPE1IcRuIcSbQoifCCFCxbbpQgghbhFC7BFC7BNCfLbY9owWIcRMIcSLQoidQoh2IcTH\ni23TZMfu24WnXPq1HdLJI4S4GXhBSmkIIb4KIKX8TJHNGhYhhArsBd4GHAU2A+8rVjHti0EIMR2Y\nLqXcIoTwA68Dd5SD7eWK3bcLT7n0a3uEn0dK+d9SSiP/diM5OYhSZSWwT0rZIaXMAN8Hbi+yTaNC\nSnlcSrklvx0DdgH1xbVqcmP37cJTLv3advjD8yHgl8U24gLUA0eGvD9KCXaukRBCNAFXAK8V15Ip\nhd23C0wp9+spVW3hQuqeUsqf5o/5AmAAT0+kbVMNIYQP+BHwCSlltNj2lDt23y4NSr1fTymHfz51\nz1MIIe4F3gXcKEt7cqMTmDnkfUN+X1kghNDIfSiellL+uNj2TAbsvl18yqFf25O2eYQQtwBfB9ZJ\nKbuLbc+FEEI4yE1s3Ujuw7AZeL+Usr2oho0CkdPL/i7QK6X8RLHtmQrYfbvwlEu/th1+HiHEPsAJ\n9OR3bZRSPlBEky6IEOJW4O8BFXhSSvk3RTZpVAgh1gK/BbbDYN3mz0spf1E8qyY3dt8uPOXSr22H\nb2NjYzNFsLN0bGxsbKYItsO3sbGxmSLYDt/GxsZmimA7fBsbG5spgu3wbWxsbKYItsO3sbGxmSLY\nDt/GxsZmimA7fBsbG5spwv8Hr+M23gtXAB8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff6f9d895d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#predict\n",
    "ix = np.arange(-3, 3, 4.0 / 100)\n",
    "ix2d = to_torch_array(ix)\n",
    "y1_pred = forward(ix2d, *case1)\n",
    "y2_pred = forward(ix2d, *case2)\n",
    "y3_pred = forward(ix2d, *case3)\n",
    "y4_pred = forward(ix2d, *case4)\n",
    "y1_neu = [get_neu_output(ix2d, i, *case1) for i in range(3)]\n",
    "y2_neu = [get_neu_output(ix2d, i, *case2) for i in range(3)]\n",
    "y3_neu = [get_neu_output(ix2d, i, *case3) for i in range(3)]\n",
    "y4_neu = [get_neu_output(ix2d, i, *case4) for i in range(3)]\n",
    "\n",
    "fig = plt.figure()\n",
    "ax1 = fig.add_subplot(2, 2, 1)\n",
    "ax2 = fig.add_subplot(2, 2, 2)\n",
    "ax3 = fig.add_subplot(2, 2, 3)\n",
    "ax4 = fig.add_subplot(2, 2, 4)\n",
    "\n",
    "\n",
    "ax1.plot(x.data.numpy()[:, 0], y1.data.numpy()[:, 0], 'bo', ms=1)\n",
    "ax1.plot(ix, y1_pred.data.numpy()[:, 0], 'r', alpha=0.3)\n",
    "ax1.plot(ix, y1_neu[0].data.numpy()[:, 0], 'c--', alpha=0.3)\n",
    "ax1.plot(ix, y1_neu[1].data.numpy()[:, 0], 'g--', alpha=0.3)\n",
    "ax1.plot(ix, y1_neu[2].data.numpy()[:, 0], 'm--', alpha=0.3)\n",
    "\n",
    "ax2.plot(x.data.numpy()[:, 0], y2.data.numpy()[:, 0], 'bo', ms=1)\n",
    "ax2.plot(ix, y2_pred.data.numpy()[:, 0], 'r',)\n",
    "ax2.plot(ix, y2_neu[0].data.numpy()[:, 0], 'c--', alpha=0.3)\n",
    "ax2.plot(ix, y2_neu[1].data.numpy()[:, 0], 'g--', alpha=0.3)\n",
    "ax2.plot(ix, y2_neu[2].data.numpy()[:, 0], 'm--', alpha=0.3)\n",
    "\n",
    "ax3.plot(x.data.numpy()[:, 0], y3.data.numpy()[:, 0], 'bo', ms=1)\n",
    "ax3.plot(ix, y3_pred.data.numpy()[:, 0], 'r',)\n",
    "ax3.plot(ix, y3_neu[0].data.numpy()[:, 0], 'c--', alpha=0.3)\n",
    "ax3.plot(ix, y3_neu[1].data.numpy()[:, 0], 'g--', alpha=0.3)\n",
    "ax3.plot(ix, y3_neu[2].data.numpy()[:, 0], 'm--', alpha=0.3)\n",
    "\n",
    "ax4.plot(x.data.numpy()[:, 0], y4.data.numpy()[:, 0], 'bo', ms=1)\n",
    "ax4.plot(ix, y4_pred.data.numpy()[:, 0], 'r',)\n",
    "ax4.plot(ix, y4_neu[0].data.numpy()[:, 0], 'c--', alpha=0.3)\n",
    "ax4.plot(ix, y4_neu[1].data.numpy()[:, 0], 'g--', alpha=0.3)\n",
    "ax4.plot(ix, y4_neu[2].data.numpy()[:, 0], 'm--', alpha=0.3)\n",
    "\n",
    "# ax1.annotate('M=1', xy=(80, 80), xycoords='figure points')\n",
    "# ax2.annotate('M=3', xy=(80, 80), xycoords='figure points')\n",
    "# ax3.annotate('M=10', xy=(80, 80), xycoords='figure points')\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
